\subsubsection{Descripci\'on}
La implementaci\'on de este algoritmo es muy parecida a lo que es umbralizar, por dos motivos: en primer lugar, no se cambia la ubicaci\'on de cada pixel de la imagen fuente en la imagen destino. En segundo lugar, el procesamiento de cada pixel consta de asignar un valor al pixel en la imagen destino en base al rango de valores que este tenga. Para el caso del pixel de coordenadas $(i,j)$ sumamos el valor de los 4 pixels que conforman el cuadrado dado por las coordenadas:

\begin{center}

\begin{math}
    (i,j) (i+1,j) (i, j+1) (i+1, j+1)
\end{math}
\end{center}

Para iterar sobre la imagen origen (y en consecuencia destino) vamos a seguir el mismo m\'etodo que con las otras implementaciones. En cada iteraci\'on nos movemos 16 bytes y para el remanente de pixels (aquellos que estan despu\'es de la \'ultima columna m\'ultiplo de 16), reasignamos el n\'umero de columna a : $ancho imagen - 16$.

Otro dato a tener en cuenta a la hora de iterar la imagen fuente es que a diferencia de los otros algoritmos, aqu\'i cuando avanzamos de fila lo hacemos de a 2 y no de a 1.

\subsubsection{Carga de datos}
Inicializamos $rbx$ y $r10$ como los \'indices para las filas y columnas respectivamente. $rdi$ y $r12$ apuntan a la fila actual y a la siguiente en la imagen de origen. $rsi$ y $r13$ apuntan a las filas actual y a la siguiente en la imagen de destino. 
\indent

\subsubsection{Ciclo Principal}
En $xmm0$ cargamos los 16 bytes apuntados por $rdi + r10$ y en $xmm1$ los 16 pixeles inmediatamente debajo de estos. Primero trabajamos con los 8 bytes inferiores de cada registro. Desempaquetamos los bytes a words y sumamos los registros entre si.
    \begin{center}
        \xmmxWord{$s1$}{$s2$}{$s3$}{$s4$}{$s5$}{$s6$}{$s7$}{$s8$}
    \end{center}
siendo $s_i$ cada una de estas sumas. Lo siguiente que hacemos es una suma horizontal, obteniendo
    \begin{center}
        \xmmxWord{$s_{1}+s_{2}$}{$s_{3}+s_{4}$}{$s_{5}+s_{6}$}{$s_{7}+s_{8}$}{$0$}{$0$}{$0$}{$0$}
    \end{center}

Hacemos lo mismo con la parte alta de los registros $xmm0$ y $xmm1$. Combinamos las dos sumas horizontales en el registro $xmm3$
    \begin{center}
        \xmmxWord{$s_{1}+s_{2}$}{$s_{3}+s_{4}$}{$s_{5}+s_{6}$}{$s_{7}+s_{8}$}{$s_{9}+s_{10}$}{$s_{11}+s_{12}$}{$s_{13}+s_{14}$}{$s_{15}+s_{16}$}
    \end{center}

Con las sumas realizadas, lo \'unico que resta es realizar las comparaciones y escribir las filas correspondientes en el buffer de salida. Para este fin utilizaremos los registros $xmm0$ y $xmm1$ para almacenar las filas superior e inferior resultantes.

Con una combinaci\'on de las instrucciones $pinsrw$ y $shufps$ vamos cargando los l\'imites de cada rango en los 8 words de alg\'un registro xmm. Luego realizamos la comparaci\'on contra $xmm3$ obteniendo una m\'ascara. Para los words en que obtenemos todos unos debemos escribir en esa posici\'on de los registros de salida ($xmm0$ y $xmm1$) los valores adecuados, indicados en el enunciado de este trabajo. Simplemente cargamos esos valores constantes en alg\'un registro xmm (replicados en cada word con $shufps$)y aplicamos la m\'ascara. Este procedimiento se debe repetir sucesivamente para todos los rangos definidos, y como tales rangos son disjuntos no hay posibilidad de sobreescribir los resultados de las etapas anteriores.

Finalmente bajamos los registros $xmm0$ y $xmm1$ en el buffer de salida. Incrementamos los \'indices y pasamos a la siguiente iteraci\'on.

\indent
